package com.edev.support.utils;

import com.edev.support.exception.ValidException;

/**
 * 参数校验工具类（防御式编程范式）
 * <p>
 * 核心功能：
 * 1. 提供链式校验能力
 * 2. 统一异常处理机制
 * 3. 支持自定义校验逻辑
 * <p>
 * 设计特性：
 * - 所有校验失败均抛出ValidException
 * - 支持参数化异常消息模板
 * - 函数式接口扩展校验能力
 * <p>
 * 典型使用场景：
 * - 领域模型状态校验
 * - 服务层参数校验
 * - 业务规则前置校验
 */
public class ValidUtils {
    /**
     * 空值校验（如果为空则抛出异常）
     * <p>
     * 使用示例：
     * <pre>
     * ValidUtils.isNull(order, "订单对象不能为空");
     * </pre>
     * @param value 待校验对象
     * @param desc 异常消息模板（支持%s等占位符）
     * @param objects 消息模板参数
     * @throws ValidException 当value为null时抛出
     */
    public static void isNull(Object value, String desc, Object... objects) {
        if(value==null) throw new ValidException(desc, objects);
    }

    public static void isNotNull(Object value, String desc, Object... objects) {
        if(value!=null) throw new ValidException(desc, objects);
    }

    /**
     * 存在性校验（如果存在则抛出异常）
     * <p>
     * 使用示例：
     * <pre>
     * ValidUtils.isExists(user, u->userDao.exists(u.getId()), "用户%s已存在", userId);
     * </pre>
     * @param value 待校验对象
     * @param func 自定义校验函数（返回true表示存在）
     * @param desc 异常消息模板（支持%s等占位符）
     * @param objects 模板参数
     * @throws ValidException 当func返回true时抛出
     */
    public static <T> void isExists(T value, ValidFunc<T> func, String desc, Object... objects) {
        if(func.apply(value)) throw new ValidException(desc, objects);
    }

    /**
     * 存在性校验（如果不存在则抛出异常）
     * <p>
     * 使用示例：
     * <pre>
     * ValidUtils.isNotExists(productId, id->productDao.exists(id), "商品%d不存在", productId);
     * </pre>
     * @param value 待校验对象
     * @param func 自定义校验函数（返回false表示不存在）
     * @param desc 异常消息模板（支持%s等占位符）
     * @param objects 模板参数
     * @throws ValidException 当func返回false时抛出
     */
    public static <T> void isNotExists(T value, ValidFunc<T> func, String desc, Object... objects) {
        if(!func.apply(value)) throw new ValidException(desc, objects);
    }

    /**
     * 自定义校验函数接口（函数式编程支持）
     * @param <T> 输入参数类型
     */
    @FunctionalInterface
    public interface ValidFunc<T> {
        boolean apply(T obj);
    }

    /**
     * 是否发生错误校验（布尔表达式判断为true则抛出异常）
     * <p>
     * 使用示例：
     * <pre>
     * ValidUtils.isError(price < 0, "价格不能为负数");
     * </pre>
     * @param expression 校验表达式
     * @param desc 异常消息模板（支持%s等占位符）
     * @param objects 模板参数
     * @throws ValidException 当表达式为true时抛出
     */
    public static void isError(boolean expression, String desc, Object... objects) {
        if(expression) throw new ValidException(desc, objects);
    }
}


